#include<stdio.h>
#include<sys/types.h>//getpid函数的库
#include<unistd.h>

int main()
{
    printf("我是一个父进程，我的pid: %d\n",getpid());
    
    //bash也是C语言写的，命令行启动的进程都是bash的子进程，猜测bash源代码中创建子进程用的就是这个fork
    pid_t id = fork();//创建子进程，fork函数返回相应的值就是在写入数据，id作为父进程定义的变量，保存了写入的数据
    //在返回的时候发生了写时拷贝，所以同一个变量会有不同的值
    

    //fork之后，用if进行分流
    if(id < 0)
       return 1;
    else if(id == 0)//子进程返回0
    {
        //child
        while(1)
        {
           printf("我是子进程:pid: %d, ppid: %d, ret: %d, &id: %p,我正在下载\n",getpid(),getppid(),id,&id);//通过父子进程的id地址对比，可以知道同一个变量确实是呈现出了两个不同的值，这与物理地址和写时拷贝有关系
           sleep(1);
        }
    }
    else
    {
        //parent
        while(1)
        {
           printf("我是父进程:pid: %d, ppid: %d, ret: %d, &id: %p,我正在播放\n",getpid(),getppid(),id,&id);
           sleep(1);
        }
     }



    //while(1)
    //{
    //   printf("我是一个进程，我的pid是: %d, ppid: %d, fork_rval: %d\n",getpid(),getppid(),id);
    //   sleep(1);//加上sleep是为了让结果更加明显
    //}




    //chdir("/home/gaoxiaohang/ddcode");//改变进程启动的目录，不在默认的当前工作目录下创建

    ////cwd/TEST.txt:cwd表示当前工作目录，一般进程启动的位置默认是当前工作目录
    //
    //FILE *fp = fopen("TEST.txt","w");
    //if(fp == NULL)
    //   return 1;
    //fclose(fp);

    //while(1)
    //{
    //    printf("I am a process: myid: %d, parent id: %d\n",getpid(), getppid());//加换行符是为了刷新缓冲区
    //    sleep(1);
    //}

    return 0;
}
